﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Data.OleDb;
using Aga.Psad.Mvc.Services.Dtos;

namespace Aga.Informatizacion.Documentos
{
    public partial class LoteHOPE : Form
    {
        BackgroundWorker worker = new BackgroundWorker();
        private string archivoProcesar;

        public LoteHOPE()
        {
            InitializeComponent();
        }

        private void btnAbrir_Click(object sender, EventArgs e)
        {
            FileDialog dialog = new OpenFileDialog();
            dialog.Filter = "(*.mdb)|*.mdb";
            dialog.InitialDirectory = ConfiguracionHOPE.CarpetaInicial;
            dialog.Title = "Seleccione el archivo";

            dialog.FileOk += (s, a) =>
            {
                txtArchivoAProcesar.Text = archivoProcesar = (s as OpenFileDialog).FileName;
            };

            dialog.ShowDialog();
        }

        private void btnSalir_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void btnProcesar_Click(object sender, EventArgs e)
        {
            // chequeo que haya seleccionado un archivo
            if (string.IsNullOrEmpty(this.archivoProcesar))
            {
                MessageBox.Show(
                    "Debe seleccionar un archivo a procesar.",
                    "Archivos no seleccionado",
                    MessageBoxButtons.OK,
                    MessageBoxIcon.Information,
                    MessageBoxDefaultButton.Button1);

                return;
            }

            // chequeo que exista el arhivo
            if (!File.Exists(this.archivoProcesar))
            {
                MessageBox.Show(
                    "El archivo seleccionado para procesar no existe.\nPor favor, vuelva a seleccionar el archivo.",
                    "Archivos inexistente",
                    MessageBoxButtons.OK,
                    MessageBoxIcon.Information,
                    MessageBoxDefaultButton.Button1);

                return;
            }

            // switcheo los botones de procesar y cancelar
            btnProcesar.Visible = false;
            btnCancelar.Visible = true;
            btnAbrir.Enabled = false;
            btnSalir.Enabled = false;

            // preparo la barra de estado
            pgbEstado.Maximum = 100;
            pgbEstado.Minimum = 0;
            pgbEstado.Value = 0;

            // preparo el background worker para no perder respueta en la ui
            worker.WorkerReportsProgress = true;
            worker.WorkerSupportsCancellation = true;

            worker.DoWork += (s, a) =>
            {
                // inicio el proceso
                ProcesarArchivo((s as BackgroundWorker), this.archivoProcesar);
            };

            worker.RunWorkerCompleted += (s, a) =>
            {
                // switcheo los botones de procesar y cancelar
                btnProcesar.Visible = true;
                btnCancelar.Visible = false;
                btnAbrir.Enabled = true;
                btnSalir.Enabled = true;
            };

            worker.ProgressChanged += (s, a) =>
            {
                // modifico la barra de progreso
                pgbEstado.Value = a.ProgressPercentage;
            };

            worker.RunWorkerAsync();
        }

        private void ProcesarArchivo(BackgroundWorker worker, string pathArchivo)
        {
            int tipoDocumentoId = ConfiguracionHOPE.TipoDocumentoId;
            int clienteId = ConfiguracionHOPE.ClienteId;
            int totalRegistros = 0;
            int progress = 0;
            int grupo = 0;
            int ultimaImagen = 0;
            int caja = 0;
            DocumentoDto documentoActual = null;

            // preparo el connection string
            string connectionString =
                string.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0}",
                pathArchivo);

            try
            {
                using (OleDbConnection conn = new OleDbConnection(connectionString))
                {
                    // abro la conexion
                    conn.Open();

                    // obtengo el total de registros de documentos para la barra de progreso
                    using (OleDbCommand cmd = new OleDbCommand("SELECT COUNT(*) FROM Imagenes", conn))
                    {
                        totalRegistros = (int)cmd.ExecuteScalar();
                    }

                    // Actualizo los tipos de documentos
                    using (OleDbCommand cmd = new OleDbCommand("SELECT AGA_Grupo, AGA_UltImagen, AGA_Caja FROM Imagenes", conn))
                    {
                        using (OleDbDataReader reader = cmd.ExecuteReader())
                        {
                            using (DocumentoDataServiceClient documentoService = new DocumentoDataServiceClient())
                            {
                                while (reader.Read())
                                {
                                    // obtengo la información del registro actual
                                    grupo = reader.GetInt32(0);
                                    ultimaImagen = reader.GetInt32(1);
                                    caja = reader.GetInt32(2);

                                    // obtengo el documento por los valores clave
                                    documentoActual = documentoService.InformatizarDocumento(clienteId, tipoDocumentoId, grupo.ToString(), caja, ultimaImagen);

                                    // muevo la barra de progreso
                                    worker.ReportProgress(((progress++) * 100) / totalRegistros);

                                    // si tengo que cancelar... cancelo
                                    if (worker.CancellationPending)
                                    {
                                        MessageBox.Show(
                                            "Proceso cancelado.",
                                            "Proceso",
                                            MessageBoxButtons.OK,
                                            MessageBoxIcon.Exclamation,
                                            MessageBoxDefaultButton.Button1);

                                        break;
                                    }
                                }
                            }
                        }
                    }
                }

                if (!worker.CancellationPending)
                {
                    // informo la finalización del proceso
                    MessageBox.Show(
                        "Proceso finalizado con exito.",
                        "Proceso",
                        MessageBoxButtons.OK,
                        MessageBoxIcon.Information,
                        MessageBoxDefaultButton.Button1);
                }

            }
            catch (Exception ex)
            {
                MessageBox.Show(
                    string.Format("Ocurrio un error procesando el archivo:\n{0}", ex.Message),
                    "Proceso",
                    MessageBoxButtons.OK,
                    MessageBoxIcon.Error,
                    MessageBoxDefaultButton.Button1);
            }
        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            // switcheo los botones de procesar y cancelar
            btnProcesar.Visible = true;
            btnCancelar.Visible = false;

            worker.CancelAsync();
        }
    }
}
